package Queue;
import LinearList.Node;

public class LinkQueue implements IQueue{
    // 链表队列

    // 队首指针
    private Node front;
    // 队尾指针
    private Node rear;

    // 构造空队列
    public LinkQueue() {
        // 将前后指针都置为空
        front = rear = null;
    }

    // 清空队列
    public void clear() {
        front = rear = null;
    }

    // 判断是否为空
    public boolean isEmpty() {
        return front==null;
    }


    // 返回队列的长度
    public int length() {
        Node p =front;
        int i = 0;
        while(p!=null){
            p = p.next;
            i++;
        }
        return i;
    }

    // 读取队首元素并且返回
    public Object peek() {
        if(isEmpty()){
            return null;
        }else {
            return front.data;
        }
    }

    // 入队列
    public void offer(Object x) throws Exception {
        // 需要进行判断 如果队列为空队列 需要先把首位结点 同时指向进来的元素
        Node p = new Node(x);
        if(isEmpty()){
            front = rear = p;
        }else {
            rear.next = p;
            rear = p;
        }
    }

    // 出队列
    public Object poll() {
        if(isEmpty()){
            return null;
        }else {
            // 需要对队尾结点进行判断
            Node p = front;
            front = front.next;
            // 如果首节点就是尾结点
            if(p==rear){
                rear = null;
            }
            return p.data;
        }
    }

    // 输出队列中的所有数据元素
    public void display() {
        if(!isEmpty()){
            for(Node p=front; p!=null; p=p.next){
                System.out.println(p.data+" ");
            }
        }else {
            System.out.println("此队列为空队列");
        }

    }
}
